﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using NGI_Entidades;
using NGI_Auxiliares;
using NGI_Enumerador;
using NGI_Errores;

namespace NGI_Logica
{
    public class Sesiones
    {
        public static Dictionary<NombreCampoCredencial, String> CamposCredenciales = new Dictionary<NombreCampoCredencial, String>(){ 
            {NombreCampoCredencial.Usuario, "Usuario"}, 
            {NombreCampoCredencial.Contrasena, "Contrasena"}, 
            {NombreCampoCredencial.ExpiracionSesion, "ExpiracionSesion"}
        };

        public static Sesion CargarSesionGuardada()
        {

            String NombreArchivoCredenciales = ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ConfigurationManager.AppSettings["NombreArchivoCredenciales"].ToString();
            String CredencialesEncriptadas = AccesoDisco.ObtenerContenidoEnLineas(NombreArchivoCredenciales);

            if (String.IsNullOrEmpty(CredencialesEncriptadas))
                return Sesion.Vacia();

            String Credenciales = EncDec.Decrypt(CredencialesEncriptadas, ConfigurationManager.AppSettings["ContrasenaEncriptacion"]);
            Dictionary<String, String> DatosSesion = Funciones.SepararDatosCredenciales(Credenciales);

            try
            {
                if (!String.IsNullOrEmpty(DatosSesion[CamposCredenciales[NombreCampoCredencial.Usuario]]) && !String.IsNullOrEmpty(DatosSesion[CamposCredenciales[NombreCampoCredencial.Contrasena]]) && !String.IsNullOrEmpty(DatosSesion[CamposCredenciales[NombreCampoCredencial.ExpiracionSesion]]))
                {
                    Usuario UsuarioALoguear = Usuario.ALoguear(DatosSesion[CamposCredenciales[NombreCampoCredencial.Usuario]], DatosSesion[CamposCredenciales[NombreCampoCredencial.Contrasena]]);
                    DateTime FechaExpiracion = Convert.ToDateTime(DatosSesion[CamposCredenciales[NombreCampoCredencial.ExpiracionSesion]]);
                    return Sesion.QuiereLoguear(UsuarioALoguear, FechaExpiracion);
                }
                else
                {
                    return Sesion.Vacia();
                }
            }
            catch (Exception ex)
            {
                return Sesion.Vacia();
                Errores.LoguearError(ex, "Sesiones.CargarSesionGuardada");
            }
        }

        public static void RecordarCredenciales(Sesion SesionNueva)
        {
            String CredencialesPlano = CamposCredenciales[NombreCampoCredencial.Usuario] + ConfigurationManager.AppSettings["CaracterLimiteClaveValorCredenciales"].ToString() + SesionNueva.UsuarioLogueado.NombreUsuario + Convert.ToChar(ConfigurationManager.AppSettings["CaracterLimiteCampoCredenciales"]).ToString() +
                CamposCredenciales[NombreCampoCredencial.Contrasena] + ConfigurationManager.AppSettings["CaracterLimiteClaveValorCredenciales"].ToString() + SesionNueva.UsuarioLogueado.Contrasena + Convert.ToChar(ConfigurationManager.AppSettings["CaracterLimiteCampoCredenciales"]).ToString() +
                CamposCredenciales[NombreCampoCredencial.ExpiracionSesion] + ConfigurationManager.AppSettings["CaracterLimiteClaveValorCredenciales"].ToString() + SesionNueva.Vencimiento.ToShortDateString();

            String Credenciales = EncDec.Encrypt(CredencialesPlano, ConfigurationManager.AppSettings["ContrasenaEncriptacion"]);

            String NombreArchivoCredenciales = ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ConfigurationManager.AppSettings["NombreArchivoCredenciales"].ToString();
            AccesoDisco.GuardarContenido(NombreArchivoCredenciales, Credenciales);
        }

        public static void BorrarCredenciales()
        {
            String NombreArchivoCredenciales = ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ConfigurationManager.AppSettings["NombreArchivoCredenciales"].ToString();
            AccesoDisco.EliminarArchivo(NombreArchivoCredenciales);
        }
    }
}
